package com.zhengshan.demo.unit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * todo
 *
 * 代码已经基本实现了普通队列的生产与消费，但是上述的例子中消息的消费者存在两个问题：
 *
 * 普通的redis队列，为了实现业务，通常会使用while进行循环，这样的话没有消息时依旧会频繁的执行循环，造成cpu的空转，所以一般会在代码中增加sleep来解决该问题，但因此又会造成消息延迟问题。
 * 如果生产者速度大于消费者消费速度，消息队列长度会一直增大，时间久了会占用大量内存空间
 * ————————————————
 * 版权声明：本文为CSDN博主「夏寻.」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
 * 原文链接：https://blog.csdn.net/weixin_51435347/article/details/131174975
 *
 * @author zhengshan
 * @Date 2023/10/20 16:18
 */
@Component
public class SingleRedisUnits {

    public static final String SINGLE_QUEUE_NAME = "queue:single";

    @Autowired
    private RedisTemplate redisTemplate;

    public void SingleProducts() {
        int i = 0;
        while(true) {
            redisTemplate.opsForList().leftPush(SINGLE_QUEUE_NAME, "test" + i);
            i++;
        }
    }

    public void SingleConsumer() {
        while(true) {
            try {
                String value = (String) redisTemplate.opsForList().leftPop(SINGLE_QUEUE_NAME);
                if(Objects.nonNull(value)) {
                    System.out.println(value);
                }else {
                    TimeUnit.MILLISECONDS.sleep(500);
                }
            } catch (Exception e) {
                System.out.println("" +e.getMessage());
            }
        }
    }
}
